package 蚂蚁课堂;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.StampedLock;

/**
 * tryAcquire:最适合做秒杀，因为tryAcquire不管有没有获取到许可证都会立马返回，而不是进入等待队列
 */
public class SemaphoreDemo2 {


    public static void main(String[] args) {

        /**
         * 创建信号量，并设置6个许可证+竞争【即：设置商品有6件库存】
         */
        final Semaphore semaphore=new Semaphore(6,true);
        for (int i=0;i<20;i++){
            new Thread(new Runnable() {
                public void run() {
                    /**
                     * tryAcquire()不像acquire()那样，
                     * acquire获取不到许可证则进入等待状态，若acquire没设置超时时间或该线程没被打断，则该线程会一直等待，知道获取到许可证为止
                     * tryAcquire是尝试获取许可证，不管有没有获取到许可证，都会立马返回，不会进入等待状态，
                     *      获取到了返回true，获取不到返回false。
                     *
                     *
                     */
                    boolean b = semaphore.tryAcquire();
                    if (b){
                        System.out.println(Thread.currentThread().getName()+"购买商品成功");

                            /**
                             * 注意在商品秒杀的时候，千万不要释放许可证，因为库存就6件，秒杀完就没库存了
                             * 若此处再归还许可证，那么必将超卖
                             */
                            //semaphore.release();


                    }else {
                        System.out.println(Thread.currentThread().getName()+"购买商品失败");
                    }
                }
            },i+"").start();

        }
    }
}
